home *** CD-ROM | disk | FTP | other *** search
/ boe.pres.k12.wv.us / boe.pres.k12.wv.us.zip / boe.pres.k12.wv.us / Utilities / Xerox Workcentre 5335 / Windows Scan / 32-bit_x86 / Russian / cpsimage.cab / data / cpsimaging.elf next >
Text File  |  2010-03-31  |  16KB  |  425 lines

  1. /*
  2. ** $Id: cpsimaging.elf,v 1.48 2010/03/29 14:27:07 campanel Exp $
  3. **
  4. ** Classes for CPSIMAGING "package"
  5. **    CPSIMAGING is an optimized interface for the CPS Scaning Drivers
  6. **
  7. *******************************************************************************/
  8. #load "docio/doctransforms.elf";
  9. #load "xipProcs/xipflatten.proc";
  10. // #load "xipProcs/printImageLayers.proc";
  11.  
  12. /******************************************************************************/
  13. /* @CPSCONTROLLER
  14. // DESCRIPTION
  15.    This class is used to control thumbnail creation, Memory DIB access, and a
  16.    limited set of file conversions for the CPS Scan Drivers
  17. */
  18. /* @initialize Causes the controller environment to be initialized. */
  19. /******************************************************************************/
  20. CLASS CPSCallback {
  21.     METHOD CPSDocumentInfoCB (
  22.         POINTER  pInfo, INTEGER width, INTEGER height, INTEGER bpl, INTEGER seps,
  23.         STRING format, INTEGER pages, INTEGER bps, INTEGER compress,
  24.         INTEGER xres, INTEGER yres
  25.       ) NATIVE "CPSInfoCallback@cpsimage2";
  26.       
  27.     METHOD CPSGetImageData(XIPIMAGE img, POINTER dest) RETURNS (INTEGER count)
  28.         NATIVE "getXIPImageData@xiputil";
  29. }
  30.  
  31. /******************************************************************************/
  32. /* @CPSCONTROLLER
  33. // DESCRIPTION
  34.    This class is used to control thumbnail creation, Memory DIB access, and a
  35.    limited set of file conversions for the CPS Scan Drivers
  36. */
  37. /* @initialize Causes the controller environment to be initialized. */
  38. /******************************************************************************/
  39. CLASS CPSCONTROLLER
  40. {
  41.     XIPIMAGE flatImg;  // We want to keep conversions to a minimum
  42.     STRING   docid;    // document id for the current conversion
  43.     STRING   fmt;      // format of the current document
  44.     INTEGER  pgnum;    // page number for already flattened image
  45.  
  46.     METHOD initialize ()
  47.     {
  48.         if (this.isInitialized == FALSE)
  49.             this.isInitialized = TRUE;
  50.     }
  51.  
  52.     METHOD setImgCache (XIPIMAGE img, STRING id, DOCUMENTREADER dr, INTEGER page)
  53.     {
  54.         if ( !this.flatImg || this.docid != id || this.pgnum != page ) {
  55.             this.flatImg = Flatten ( imgIn: img.Copy() );
  56.             this.docid = id;
  57.             this.pgnum = page;
  58.         }
  59.  
  60.         if ( ( !this.fmt && dr ) || ( id != this.docid ) ) {
  61.             STRING fmt;
  62.             dr.getFormat() Returns (format: fmt);
  63.             this.fmt = fmt;
  64.         }
  65.     }
  66.  
  67.     METHOD initDocument(STRING filename, STRING docid)
  68.     {
  69.         DOCUMENTREADER dr = CreateDocumentReader (filename: filename);
  70.         if (dr)
  71.             this.docs.insert(name: docid, obj: dr);
  72.         else
  73.             SetStatus( op: "stop", msg:
  74.                "CPSCONTROLLER::initDocument unable to create DOCUMENTREADER\n");
  75.     }
  76.  
  77.     METHOD getDocumentImage(STRING docid) RETURNS (CPSDocumentInfo dinfo)
  78.     {
  79.         dinfo.format = "PDF";
  80.         dinfo.pixels = 255;
  81.         dinfo.scanlines = 4095;
  82.     }
  83.  
  84.     METHOD getRasterLayer (XIPIMAGE img) Returns (XIPIMAGE raster)
  85.     {
  86.         INTEGER ii, ltype;
  87.         raster = img;
  88.         if ( img.nlayers == 1 ) return;
  89.  
  90.         for( ii=0; ii<img.nlayers; ii++ ) {
  91.             raster = img.getLayer ( num: ii );
  92.             ltype = raster.getMember (member: "layerType");
  93.             if ( ltype == XIP_Contone   || ltype == XIP_Binary    ||
  94.                  ltype == XIP_ColorMask || ltype == XIP_ContoneMask ) {
  95.                 // capture base settings
  96.                 raster.resolution  = (img.resolution[0], img.resolution[1]);
  97.                 raster.imageHeight = img.imageHeight;
  98.                 raster.imageWidth  = img.imageWidth;
  99.                 return;
  100.                 }
  101.         }
  102.         print "No raster layer found!!!!";
  103.     }
  104.  
  105.     METHOD getDocumentInfo( STRING docid, POINTER ep )
  106.     {
  107.         DOCUMENTREADER dr = this.docs.ref(name: docid);
  108.         if (!dr)
  109.         {
  110.             SetStatus( op: "stop", msg:
  111.                "CPSCONTROLLER::getDocumentInfo unable to get DOCUMENTREADER\n");
  112.             return;
  113.         }
  114.  
  115.         XIPIMAGE xi = dr.getPage(pgnum: 1);
  116.         if (!xi)
  117.         {
  118.             SetStatus( op: "stop", msg:
  119.                "CPSCONTROLLER::getDocumentInfo unable to getPage\n");
  120.             return;
  121.         }
  122.         
  123.         this.setImgCache (img:xi, id:docid, dr:dr, page:1);
  124.         xi = this.getRasterLayer ( img: this.flatImg );
  125.  
  126.         CPSCallback cpscb;
  127.         cpscb.CPSDocumentInfoCB (
  128.                  pInfo: ep,
  129.                  width: xi.getMember(member: "pixels"),
  130.                 height: xi.getMember(member: "scanlines"),
  131.                    bpl: xi.getMember(member: "bytes"),
  132.                   seps: xi.getMember(member: "seps"),
  133.                 format: this.fmt,
  134.                  pages: dr.getPageCount(),
  135.                    bps: xi.getMember(member: "bits"),
  136.               compress: xi.getMember(member: "compression"),
  137.                   xres: xi.resolution[0],
  138.                   yres: xi.resolution[1]
  139.                       );
  140.     }
  141.     
  142.     METHOD makeThumbnail ( STRING docid, STRING outfile, INTEGER width, INTEGER height )
  143.     {
  144.        DOCUMENTREADER dr = this.docs.ref(name: docid);
  145.        if (!dr)
  146.        {
  147.           SetStatus( op: "stop", msg:
  148.              "CPSCONTROLLER:makeThumbnail unable to get DOCUMENTREADER");
  149.           return;
  150.        } 
  151.         
  152.        try {
  153.          DOCUMENTWRITER dw = CreateDocumentWriter( filename: outfile);
  154.        } catch {
  155.           try { print "Unable to make DOCUMENTWRITER object for filename " + outfile;
  156.                 print "Fall back is \"bmp\" format";
  157.                 DOCUMENTWRITER dw = CreateDocumentWriter( filename: outfile, format: "bmp" ); }
  158.           catch {
  159.              SetStatus( op: "stop",
  160.                        msg: "CPSCONTROLLER:makeThumbnail unable to create DocumentWriter for \"" +
  161.                              outfile + "\"");
  162.              return;
  163.           }
  164.        }
  165.  
  166.        // Turn off page numbering for single page file formats
  167.        dw.setAttr(name:"_DIOnoPageNumFilename", obj:1);
  168.         
  169.        // make a new image by transforming the input page
  170.        XIPIMAGE xim = dr.getPage(pgnum: 1);
  171.        if (!xim)
  172.        {
  173.            SetStatus( op: "stop", msg: "CPSCONTROLLER:makeThumbnail Not able to get page");
  174.            return;
  175.        }
  176.  
  177.        this.setImgCache (img:xim, id:docid, dr:dr, page:1);
  178.        xim = this.getRasterLayer ( img: this.flatImg );
  179.  
  180.        INTEGER photo, v, w, h;
  181.        w = width; h = height;
  182.  
  183.        // basic formatting
  184.        xim = xim.unCompress().unmap().thumbnail (size:(w, h));
  185.  
  186.        // pad to keep aspect ratio of thumbnail
  187.        w = width - xim.getMember (member:"pixels");
  188.        h = height - xim.getMember (member:"scanlines");
  189.        photo = xim.getMember (member: "photometry");
  190.  
  191.        if ( photo != XIP_K_COLOR ) v = 255;
  192.        xim = xim.frame (value: (v,v,v), outside:TRUE, thick:(w/2,w/2,h/2,h/2) );
  193.  
  194.        if ( xim.getMember (member:"photometry") == XIP_DEVICERGB_COLOR )
  195.           xim = xim.modheader( modify: ("Photometry:name:srgb") ).exec();
  196.  
  197.        // pretty much everything needs pixel interleaved data
  198.        if ( xim.getMember (member:"compression") == 0 )
  199.           xim = xim.interleave (pixel: TRUE);
  200.  
  201.        if ( xim.getMember (member:"photometry") == XIP_K_COLOR )
  202.           xim = xim.cspace(outspace:"gray");
  203.  
  204.        if ( xim.getMember (member: "compression") == XIP_JPEG_COMP )
  205.           xim = xim.jprecomp (mbands: TRUE);
  206.  
  207.        // Since the page is now fully rendered adjust dimensions
  208.        xim.imageWidth  = xim.getMember(member: "pixels");
  209.        xim.imageHeight = xim.getMember(member: "scanlines");
  210.        xim.setMember (member: "width", value: xim.imageWidth);
  211.        xim.setMember (member: "height", value: xim.imageHeight);
  212.  
  213.        dw.appendPage (pgImg:xim);
  214.     
  215.        // force the file to be written and release page resources
  216.        dw.release();
  217.     }
  218.     
  219.     
  220.     METHOD getSizeForDIB ( STRING docid, INTEGER pageNum, POINTER info )
  221.                  RETURNS ( INTEGER memsize )
  222.     {
  223.         STRING me = "CPSCONTROLLER::getSizeForDIB";
  224.         DOCUMENTREADER dr = this.docs.ref(name: docid);
  225.         if (!dr)
  226.         {
  227.             SetStatus( op: "stop", msg: me + " Could not find document reference\n");
  228.             return;
  229.         }
  230.  
  231.         if ( pageNum <= 0 ) pageNum = 1;
  232.         XIPIMAGE xim = dr.getPage(pgnum: pageNum);
  233.         if (!xim)
  234.         {
  235.             SetStatus( op: "stop", msg: me + " Unable to getPage\n");
  236.             return;
  237.         }
  238.  
  239.         this.setImgCache (img:xim, id:docid, dr:dr, page:pageNum);
  240.         xim = this.getRasterLayer ( img: this.flatImg );
  241.  
  242.         if ( xim.getMember (member: "photometry") == XIP_BUILDMAP_COLOR)
  243.            xim = xim.unmap();
  244.         xim = xim.interleave(pixel: TRUE);
  245.  
  246.         INTEGER bitsPerSpot = xim.getMember(member: "bits") * xim.getMember(member: "seps");
  247.         INTEGER bitsPerLine = xim.getMember(member: "pixels") * bitsPerSpot;
  248.         INTEGER padWordsPerLine = (bitsPerLine + 31) / 32;
  249.         INTEGER padBytesPerLine = padWordsPerLine * 4;
  250.         memsize = xim.getMember(member: "scanlines") * padBytesPerLine;
  251.  
  252.         CPSCallback cpscb;
  253.         cpscb.CPSDocumentInfoCB (
  254.                 pInfo: info,
  255.                 width: xim.getMember(member: "pixels"),
  256.                height: xim.getMember(member: "scanlines"),
  257.                   bpl: xim.getMember(member: "bytes"),
  258.                  seps: xim.getMember(member: "seps"),
  259.                format: this.fmt,
  260.                 pages: 1,
  261.                   bps: xim.getMember(member: "bits"),
  262.              compress: xim.getMember(member: "compression"),
  263.                  xres: xim.resolution[0],
  264.                  yres: xim.resolution[1]
  265.                      );
  266.     }
  267.     
  268.     
  269.     METHOD getDocumentData ( STRING docid, INTEGER pageNum, POINTER data, POINTER info )
  270.                    RETURNS ( INTEGER count )
  271.     {
  272.         STRING me = "CPSCONTROLLER::getDocumentData";
  273.         DOCUMENTREADER dr = this.docs.ref(name: docid);
  274.         if (!dr)
  275.         {
  276.             SetStatus( op: "stop", msg: me + " Could not find document reference");
  277.             return;
  278.         }
  279.  
  280.         if ( pageNum <= 0 ) pageNum = 1;
  281.         XIPIMAGE xim = dr.getPage(pgnum: pageNum);
  282.         if (!xim)
  283.         {
  284.             SetStatus( op: "stop", msg: me + " Unable to getPage");
  285.             return;
  286.         }
  287.  
  288.         /* Requires non-MRC, uncompressed data */
  289.         XIPIMAGE outpage;
  290.         
  291.         this.setImgCache (img: xim, id: docid, dr: dr, page: pageNum);
  292.         outpage = this.flatImg;
  293.  
  294.         outpage = this.getRasterLayer ( img: outpage);
  295.         if ( outpage.getMember (member: "photometry") == XIP_BUILDMAP_COLOR)
  296.             outpage = outpage.unmap();
  297.         outpage = outpage.interleave(pixel: TRUE
  298.                 ).pad(align: 4
  299.                 ).exec();
  300.  
  301.  
  302.         // Correction for PDF inputs that default sRGB to DEVICERGB
  303.         if ( outpage.getMember (member:"photometry") == XIP_DEVICERGB_COLOR )
  304.              outpage = outpage.modheader( modify: ("Photometry:name:srgb") );
  305.  
  306.         // Want data in DIB format
  307.         if ( outpage.getMember(member: "seps") == 3 ) {
  308.            outpage = outpage.rotate(angle:"miry"
  309.                    ).cspace(outspace:"sbgr"
  310.                    ).interleave(pixel:TRUE
  311.                    ).pad(align:4
  312.                    ).exec();
  313.         } else { // the cspace is here to avoid writing out XIP_K_COLOR
  314.            outpage = outpage.rotate(angle:"miry"
  315.                    ).cspace(outspace:"gray"
  316.                    ).pad(align:4
  317.                    ).exec();
  318.         }
  319.  
  320.         CPSCallback cpscb;
  321.         cpscb.CPSDocumentInfoCB (
  322.                 pInfo: info,
  323.                 width:    outpage.getMember(member: "pixels"),
  324.                 height:   outpage.getMember(member: "scanlines"),
  325.                 bpl:      outpage.getMember(member: "bytes"),
  326.                 seps:     outpage.getMember(member: "seps"),
  327.                 format:   this.fmt,
  328.                 pages:    1,
  329.                 bps:      outpage.getMember(member: "bits"),
  330.                 compress: outpage.getMember(member: "compression"),
  331.                 xres:     outpage.resolution[0],
  332.                 yres:     outpage.resolution[1]);
  333.  
  334.         count  = cpscb.CPSGetImageData( img: outpage, dest: data);
  335.     }
  336.  
  337.  
  338.     // This really converts the whole document, not just a page
  339.     METHOD convertPage ( STRING docid, STRING outfile, STRING format, BOOLEAN test )
  340.     {
  341.         DOCUMENTREADER dr = this.docs.ref(name: docid);
  342.         if (!dr)
  343.         {
  344.             SetStatus( op: "stop",
  345.                       msg: "CPSCONTROLLER::convertPage unable to get document reference\n");
  346.             return;
  347.         }
  348.  
  349.         DOCUMENTWRITER dw = CreateDocumentWriter( filename: outfile, testfile: test, format: format);
  350.         INTEGER ii, photo;
  351.         INTEGER pgcnt = dr.getPageCount();
  352.         XIPIMAGE xim, ximt;
  353.         
  354.         for (ii=1; ii<=pgcnt; ii++)
  355.         {
  356.             xim = dr.getPage(pgnum: ii);
  357.             if (!xim)
  358.             {
  359.                 SetStatus( op: "stop", msg: "CPSCONTROLLER::convertPage unable to getPage\n");
  360.                 return;
  361.             }
  362.  
  363.             // xim.Write(filename: "foo.obj");
  364.             photo = this.getRasterLayer ( img: xim ).getMember (member:"photometry");
  365.             // print photo;
  366.  
  367.             if ( format == "PDF" && photo != XIP_BUILDMAP_COLOR) {
  368.                ximt = xim;
  369.  
  370.             } else if ( format == "XPS" ) { // should just work no matter what type of image
  371.                ximt = xim;
  372.  
  373.             } else { // most likely going to some raster format at this point
  374.                this.setImgCache (img:xim, id:docid, dr:dr, page:ii);
  375.                xim = this.getRasterLayer ( img: this.flatImg );
  376.  
  377.                // Nothing should come in as device except from PDF which calls sRGB DEVICERGB
  378.                if ( photo == XIP_DEVICERGB_COLOR ) {
  379.                    if ( xim.getMember (member:"compression") == XIP_JPEG_COMP )
  380.                        xim = xim.modheader( modify: ("Photometry:name:ycbcr") );
  381.                    else
  382.                        xim = xim.modheader( modify: ("Photometry:name:sRGB") );
  383.                }
  384.  
  385.                // Currently don't handle mapped images very well
  386.                else if ( photo == XIP_BUILDMAP_COLOR ) {
  387.                    xim = xim.unmap(pixel: TRUE);
  388.                }
  389.  
  390.                ximt = TransformPage(inpage:xim.exec(), todoc:dw);
  391.                if ( ximt.getMember (member: "compression") == XIP_JPEG_COMP )
  392.                    ximt = ximt.jprecomp (mbands: TRUE);
  393.  
  394.                /* clean any remaining transforms */
  395.                ximt = ximt.exec();
  396.                ximt.clearAttr (name: "_PDFTransform", num: 0);
  397.                ximt.clearAttr (name: "_XPSTransform", num: 0);
  398.                }
  399.  
  400.             dw.appendPage( pgImg: ximt );
  401.         }
  402.  
  403.         // force the file to be written and release page resources
  404.         dw.release();
  405.     }
  406.     
  407.     
  408.     METHOD closeDocument ( STRING docid )
  409.     {
  410.         DOCUMENTREADER dr = this.docs.extract(name: docid);
  411.         if (!dr)
  412.         {
  413.             SetStatus( op: "continue",
  414.                       msg: "CPSCONTROLLER::closeDocument unable to closeDocument\n");
  415.             return;
  416.         }
  417.         dr.release();
  418.     }
  419.  
  420.  
  421.     /************ Internal Data Members **************/
  422.     BOOLEAN isInitialized = FALSE;
  423.     LIST docs;
  424. }
  425.